﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;               // Til parametre i sql-streng

using Controller;
using Interfaces;


namespace Controller
{
    public class DBFacaden
    {
        private SqlConnection con;  // forbindelsen til databasen
        private SqlCommand cmd;     // kommando-objekt til kald af indlejret SQL erller Stored Procedure

        private EmmaSystem system;        // kendskab til controller-klassen

        public DBFacaden(EmmaSystem system)
        {
            this.system = system;

            string connectionStr = connectionStr = @"Data Source=linux2.tietgen.dk;Initial Catalog=gruppe101.2;Persist Security Info=True;User ID=gruppe101.2;Password = ce2eQaCR";

            // Skab forbindelses-objekt udfra connectionStr
            con = new SqlConnection(connectionStr);

            // Skab kommando-objekt og tilknyt til forbindelses-objekt
            cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;     // Kommandotype er Stored Procedure
        }

        // Metode til at indlæse fra databasen
        public void IndlæsFraDatabase()
        {
            IndlæsÅrsregnskaber();
            IndlæsPosteringer();
            IndlæsMedarbejdere();
            IndlæsKunder();
            IndlæsProjekter();
            IndlæsKundeProjekter();
            IndlæsFaktura();
            IndlæsVarer();
        }

        #region Operationer på posterings-objekter

        // Metode til at indlæse posterings-objekter fra databasen
        public void IndlæsPosteringer()
        {
            SqlDataReader datareader;
            long bilagsNr;
            string posteringsType;
            string beskrivelse;
            double beløb;
            DateTime dato;
            bool aktiv;
            int årstal;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsPosteringer";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    bilagsNr = (long)datareader["bilagsNr"];
                    posteringsType = (string)datareader["posteringsType"];
                    beskrivelse = (string)datareader["beskrivelse"];
                    beløb = (double)datareader["beløb"];
                    dato = (DateTime)datareader["dato"];
                    aktiv = (bool)datareader["aktiv"];
                    årstal = (int)datareader["årstal"];

                    system.IndlæsPosteringer(bilagsNr, posteringsType, beskrivelse, beløb, dato, aktiv, årstal);    // Opret posterings-objektet i modellen
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // Metode til at oprette et posterings-objekt i databasen
        public bool OpretPostering(long bilagsNr, string posteringsType, string beskrivelse, double beløb, DateTime dato, bool aktiv, int årstal)
        {
            cmd.CommandText = "OpretPostering";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@bilagsNr", SqlDbType.BigInt);
            par.Value = bilagsNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@posteringsType", SqlDbType.NVarChar);
            par.Value = posteringsType;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@beskrivelse", SqlDbType.NVarChar);
            par.Value = beskrivelse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@beløb", SqlDbType.Float);
            par.Value = beløb;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@dato", SqlDbType.DateTime);
            par.Value = dato;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiv", SqlDbType.Bit);
            par.Value = aktiv;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@årstal", SqlDbType.Int);
            par.Value = årstal;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                return false;
            }

            return true;
        }

        // Metode til at annullere et posterings-objekt i databasen
        public bool AnnullerPostering(long bilagsNr, bool aktiv)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "AnnullerPostering";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@bilagsNr", SqlDbType.BigInt);
            par.Value = bilagsNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiv", SqlDbType.Bit);
            par.Value = aktiv;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                return false;
            }

            if (NoOfRowsEffected == 1)
                return true;
            else
                return false;
        }

        #endregion

        #region Operationer på årsregnskabs-objekter

        // Metode til at indlæse årsregnskabs-objekter fra databasen
        public void IndlæsÅrsregnskaber()
        {
            SqlDataReader datareader;
            int årstal;
            double immaterielle;
            double materielle;
            double finansielle;
            double varebeholdninger;
            double tilgodehavender;
            double værdipapirer;
            double likvideBeholdninger;
            double aktiekapital;
            double overførteOverskud;
            double forslagTilUdbytte;
            double hensatteForpligtelser;
            double langfristetGæld;
            double kortfristetGæld;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsÅrsregnskaber";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    årstal = (int)datareader["årstal"];
                    immaterielle = (double)datareader["immaterielle"];
                    materielle = (double)datareader["materielle"];
                    finansielle = (double)datareader["finansielle"];
                    varebeholdninger = (double)datareader["varebeholdninger"];
                    tilgodehavender = (double)datareader["tilgodehavender"];
                    værdipapirer = (double)datareader["værdipapirer"];
                    likvideBeholdninger = (double)datareader["likvideBeholdninger"];
                    aktiekapital = (double)datareader["aktiekapital"];
                    overførteOverskud = (double)datareader["overførteOverskud"];
                    forslagTilUdbytte = (double)datareader["forslagTilUdbytte"];
                    hensatteForpligtelser = (double)datareader["hensatteForpligtelser"];
                    langfristetGæld = (double)datareader["langfristetGæld"];
                    kortfristetGæld = (double)datareader["kortfristetGæld"];

                    system.IndlæsÅrsregnskaber(årstal, immaterielle, materielle, finansielle, varebeholdninger, tilgodehavender,
                        værdipapirer, likvideBeholdninger, aktiekapital, overførteOverskud, forslagTilUdbytte, hensatteForpligtelser,
                        langfristetGæld, kortfristetGæld);    // Opret årsregnskabs-objektet i modellen
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // Metode til at oprette et årsregnskabs-objekt i databasen
        public bool OpretÅrsregnskab(int årstal)
        {
            double immaterielle = 0;
            double materielle = 0;
            double finansielle = 0;
            double varebeholdninger = 0;
            double tilgodehavender = 0;
            double værdipapirer = 0;
            double likvideBeholdninger = 0;
            double aktiekapital = 0;
            double overførteOverskud = 0;
            double forslagTilUdbytte = 0;
            double hensatteForpligtelser = 0;
            double langfristetGæld = 0;
            double kortfristetGæld = 0;

            cmd.CommandText = "OpretÅrsregnskab";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@årstal", SqlDbType.Int);
            par.Value = årstal;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@immaterielle", SqlDbType.Float);
            par.Value = immaterielle;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@materielle", SqlDbType.Float);
            par.Value = materielle;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@finansielle", SqlDbType.Float);
            par.Value = finansielle;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@varebeholdninger", SqlDbType.Float);
            par.Value = varebeholdninger;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tilgodehavender", SqlDbType.Float);
            par.Value = tilgodehavender;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@værdipapirer", SqlDbType.Float);
            par.Value = værdipapirer;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@likvideBeholdninger", SqlDbType.Float);
            par.Value = likvideBeholdninger;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiekapital", SqlDbType.Float);
            par.Value = aktiekapital;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@overførteOverskud", SqlDbType.Float);
            par.Value = overførteOverskud;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@forslagTilUdbytte", SqlDbType.Float);
            par.Value = forslagTilUdbytte;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@hensatteForpligtelser", SqlDbType.Float);
            par.Value = hensatteForpligtelser;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@langfristetGæld", SqlDbType.Float);
            par.Value = langfristetGæld;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@kortfristetGæld", SqlDbType.Float);
            par.Value = kortfristetGæld;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                return false;
            }

            return true;
        }

        // Metode til at redigere et årsregnskabs-objekt i databasen
        public bool RedigerÅrsregnskab(int årstal, double immaterielle, double materielle, double finansielle, double varebeholdninger,
            double tilgodehavender, double værdipapirer, double likvideBeholdninger, double aktiekapital, double overførteOverskud,
            double forslagTilUdbytte, double hensatteForpligtelser, double langfristetGæld, double kortfristetGæld)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "RedigerÅrsregnskab";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@årstal", SqlDbType.Int);
            par.Value = årstal;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@immaterielle", SqlDbType.Float);
            par.Value = immaterielle;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@materielle", SqlDbType.Float);
            par.Value = materielle;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@finansielle", SqlDbType.Float);
            par.Value = finansielle;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@varebeholdninger", SqlDbType.Float);
            par.Value = varebeholdninger;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tilgodehavender", SqlDbType.Float);
            par.Value = tilgodehavender;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@værdipapirer", SqlDbType.Float);
            par.Value = værdipapirer;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@likvideBeholdninger", SqlDbType.Float);
            par.Value = likvideBeholdninger;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiekapital", SqlDbType.Float);
            par.Value = aktiekapital;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@overførteOverskud", SqlDbType.Float);
            par.Value = overførteOverskud;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@forslagTilUdbytte", SqlDbType.Float);
            par.Value = forslagTilUdbytte;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@hensatteForpligtelser", SqlDbType.Float);
            par.Value = hensatteForpligtelser;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@langfristetGæld", SqlDbType.Float);
            par.Value = langfristetGæld;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@kortfristetGæld", SqlDbType.Float);
            par.Value = kortfristetGæld;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                return false;
            }

            if (NoOfRowsEffected == 1)
                return true;
            else
                return false;
        }

        #endregion

        #region Operationer på medarbejder-objekter

        // Metode til at indlæse medarbejder-objekter fra databasen
        public void IndlæsMedarbejdere()
        {
            SqlDataReader datareader;
            int medarbNr;
            string navn;
            string email;
            int tlfNr;
            string adresse;
            int postnr;
            string bynavn;
            bool aktiv;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsMedarbejder";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    medarbNr = (int)datareader["medarbNr"];
                    navn = (string)datareader["navn"];
                    email = (string)datareader["email"];
                    tlfNr = (int)datareader["tlfNr"];
                    adresse = (string)datareader["adresse"];
                    postnr = (int)datareader["postnr"];
                    bynavn = (string)datareader["bynavn"];
                    aktiv = (bool)datareader["aktiv"];

                    system.IndlæsMedarbejdere(medarbNr, navn, email, tlfNr, adresse, postnr, bynavn, aktiv);    // Opret medarbejder-objektet i modellen
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // metode til at oprette et medarbejder-objekt i databasen
        public bool OpretMedarbejder(string navn, string email, int tlfNr, string adresse, int postnr, bool aktiv, out int medarbNr)
        {
            cmd.CommandText = "OpretMedarbejder";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@navn", SqlDbType.NVarChar);
            par.Value = navn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("email", SqlDbType.NVarChar);
            par.Value = email;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tlfNr", SqlDbType.Int);
            par.Value = tlfNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@adresse", SqlDbType.NVarChar);
            par.Value = adresse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@postnr", SqlDbType.Int);
            par.Value = postnr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiv", SqlDbType.Bit);
            par.Value = aktiv;
            cmd.Parameters.Add(par);

            // Output-parameter
            par = new SqlParameter("@medarbNr", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen

                medarbNr = (int)cmd.Parameters["@medarbNr"].Value;   // medarbejderNr = output-parameter
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }

                medarbNr = 0;
                return false;
            }

            return true;
        }

        // metode til at redigere et medarbejder-objekt i databasen
        public bool RedigerMedarbejder(int medarbNr, string navn, string email, int tlfNr, string adresse, int postnr, bool aktiv)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "RedigerMedarbejder";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@medarbNr", SqlDbType.Int);
            par.Value = medarbNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@navn", SqlDbType.NVarChar);
            par.Value = navn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("email", SqlDbType.NVarChar);
            par.Value = email;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tlfNr", SqlDbType.Int);
            par.Value = tlfNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@adresse", SqlDbType.NVarChar);
            par.Value = adresse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@postnr", SqlDbType.Int);
            par.Value = postnr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiv", SqlDbType.Bit);
            par.Value = aktiv;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }
                return false;
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        // metode til at hente et bynavn ud fra postnr
        public bool GetBynavn(int postnr, out string bynavn)
        {
            SqlDataReader datareader;
            bynavn = "";

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "GetBynavn";

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@postnr", SqlDbType.NVarChar);
            par.Value = postnr;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)  
                while (datareader.Read() == true)
                {
                    bynavn = (string)datareader["Bynavn"];
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }

                bynavn = "";
                return false;
            }

            return true;
        }

        #endregion

        #region Operationer på kunde-objekter

        // Metode til at indlæse kunde-objekter fra databasen
        public void IndlæsKunder()
        {
            SqlDataReader datareader;
            int kundeNr;
            int cvrNr;
            string firmanavn;
            string kontaktperson;
            string email;
            int tlfNr;
            string adresse;
            int postnr;
            string bynavn;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsKunder";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    kundeNr = (int)datareader["kundeNr"];
                    cvrNr = (int)datareader["cvrNr"];
                    firmanavn = (string)datareader["firmanavn"];
                    kontaktperson = (string)datareader["kontaktperson"];
                    email = (string)datareader["email"];
                    tlfNr = (int)datareader["tlfNr"];
                    adresse = (string)datareader["adresse"];
                    postnr = (int)datareader["postnr"];
                    bynavn = (string)datareader["bynavn"];

                    system.IndlæsKunder(kundeNr, cvrNr, firmanavn, kontaktperson, email, tlfNr, adresse, postnr, bynavn);    // Opret kunde-objektet i systemet
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // Metode til at oprette et kunde-objekt i databasen
        public bool OpretKunde(int cvrNr, string firmanavn, string kontaktperson, string email, int tlfNr,
            string adresse, int postnr, out int kundeNr)
        {
            cmd.CommandText = "OpretKunde";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@cvrNr", SqlDbType.Int);
            par.Value = cvrNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@firmanavn", SqlDbType.NVarChar);
            par.Value = firmanavn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@kontaktperson", SqlDbType.NVarChar);
            par.Value = kontaktperson;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@email", SqlDbType.NVarChar);
            par.Value = email;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tlfNr", SqlDbType.Int);
            par.Value = tlfNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@adresse", SqlDbType.NVarChar);
            par.Value = adresse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@postnr", SqlDbType.Int);
            par.Value = postnr;
            cmd.Parameters.Add(par);

            // Output-parameter
            par = new SqlParameter("@kundeNr", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen

                kundeNr = (int)cmd.Parameters["@kundeNr"].Value;   // kundeNr = output-parameter
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }

                kundeNr = 0;
                return false;
            }

            return true;
        }

        // Metode til at redigere et kunde-objekt i databasen
        public bool RedigerKunde(int kundeNr, int cvrNr, string firmanavn, string kontaktperson, string email, int tlfNr,
            string adresse, int postnr)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "RedigerKunde";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@kundeNr", SqlDbType.Int);
            par.Value = kundeNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@cvrNr", SqlDbType.Int);
            par.Value = cvrNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@firmanavn", SqlDbType.NVarChar);
            par.Value = firmanavn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@kontaktperson", SqlDbType.NVarChar);
            par.Value = kontaktperson;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@email", SqlDbType.NVarChar);
            par.Value = email;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tlfNr", SqlDbType.Int);
            par.Value = tlfNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@adresse", SqlDbType.NVarChar);
            par.Value = adresse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@postnr", SqlDbType.Int);
            par.Value = postnr;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }
                return false;
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        #endregion

        #region Operationer på projekt-objekter

        // Metode til at indlæse projekt-objekter fra databasen
        public void IndlæsProjekter()
        {
            SqlDataReader datareader;
            int projektNr, medarbNr;
            string titel, projektfase, deadline, tidsforbrug;
            DateTime starttidspunkt, sluttidspunkt;
            bool aktiv;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsProjekter";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    projektNr = (int)datareader["projektNr"];
                    titel = (string)datareader["titel"];
                    starttidspunkt = (DateTime)datareader["starttidspunkt"];
                    projektfase = (string)datareader["projektfase"];
                    deadline = (string)datareader["deadline"];
                    tidsforbrug = (string)datareader["tidsforbrug"];
                    sluttidspunkt = (DateTime)datareader["sluttidspunkt"];
                    aktiv = (bool)datareader["aktiv"];
                    medarbNr = (int)datareader["medarbNr"];

                    system.IndlæsProjekter(projektNr, titel, starttidspunkt, projektfase, deadline, tidsforbrug, sluttidspunkt, aktiv, medarbNr);    // Opret projekt-objektet i systemet
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // Metode til at oprette et projekt-objekt i databasen
        public bool OpretProjekt(string titel, DateTime starttidspunkt, string projektfase, string deadline, int medarbNr, out int projektNr)
        {
            string tidsforbrug = "";
            DateTime sluttidspunkt = starttidspunkt;
            bool aktiv = true;

            cmd.CommandText = "OpretProjekt";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@titel", SqlDbType.NVarChar);
            par.Value = titel;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@starttidspunkt", SqlDbType.DateTime);
            par.Value = starttidspunkt;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@projektfase", SqlDbType.NVarChar);
            par.Value = projektfase;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@deadline", SqlDbType.NVarChar);
            par.Value = deadline;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tidsforbrug", SqlDbType.NVarChar);
            par.Value = tidsforbrug;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@sluttidspunkt", SqlDbType.DateTime);
            par.Value = sluttidspunkt;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiv", SqlDbType.Bit);
            par.Value = aktiv;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@medarbNr", SqlDbType.Int);
            par.Value = medarbNr;
            cmd.Parameters.Add(par);

            // Output-parameter
            par = new SqlParameter("@projektNr", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen

                projektNr = (int)cmd.Parameters["@projektNr"].Value;   // kundeNr = output-parameter
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }

                projektNr = 0;
                return false;
            }

            return true;
        }

        // Metode til at redigere et projekt-objekt i databasen
        public bool RedigerProjekt(int projektNr, string titel, DateTime starttidspunkt, string projektfase,
            string deadline, string tidsforbrug, DateTime sluttidspunkt, bool aktiv, int medarbNr)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "RedigerProjekt";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@projektNr", SqlDbType.Int);
            par.Value = projektNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@titel", SqlDbType.NVarChar);
            par.Value = titel;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@starttidspunkt", SqlDbType.DateTime);
            par.Value = starttidspunkt;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@projektfase", SqlDbType.NVarChar);
            par.Value = projektfase;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@deadline", SqlDbType.NVarChar);
            par.Value = deadline;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tidsforbrug", SqlDbType.NVarChar);
            par.Value = tidsforbrug;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@sluttidspunkt", SqlDbType.DateTime);
            par.Value = sluttidspunkt;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiv", SqlDbType.Bit);
            par.Value = aktiv;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@medarbNr", SqlDbType.Int);
            par.Value = medarbNr;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }
                return false;
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at opdatere et projekt-objekts tidsforbrug i databasen
        public bool OpdaterProjektsTidsforbrug(int projektNr, string tidsforbrug)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "OpdaterProjektsTidsforbrug";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@projektNr", SqlDbType.Int);
            par.Value = projektNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tidsforbrug", SqlDbType.NVarChar);
            par.Value = tidsforbrug;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }
                return false;
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at oprette en kundeprojekt-tabel i databasen (associeringen mellem et kunde-objekt og et projekt-objekt)
        public bool OpretKundeProjekt(int projektNr, int kundeNr)
        {
            cmd.CommandText = "OpretKundeProjekt";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@kundeNr", SqlDbType.Int);
            par.Value = kundeNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@projektNr", SqlDbType.Int);
            par.Value = projektNr;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }

                return false;
            }

            return true;
        }

        // metode til at slette en kundeprojekt-tabel fra databasen
        public bool SletKundeProjekt(int projektNr, int kundeNr)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "SletKundeProjekt";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@kundeNr", SqlDbType.Int);
            par.Value = kundeNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@projektNr", SqlDbType.Int);
            par.Value = projektNr;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }
                return false;
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at indlæse kundeprojekt-associeringen fra databasen
        public void IndlæsKundeProjekter()
        {
            SqlDataReader datareader;
            int projektNr, kundeNr;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsKundeProjekter";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    projektNr = (int)datareader["projektNr"];
                    kundeNr = (int)datareader["kundeNr"];

                    system.IndlæsKundeProjekter(projektNr, kundeNr);    // Opret kundeprojekt-associeringen i systemet
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // Metode til at indlæse feltet tid fra ArbejdsLog tabellen i databasen
        public bool IndlæsTidArbejdsLog(int projektNr)
        {
            SqlDataReader datareader;
            int tid;

            cmd.CommandText = "LæsTidArbejdsLog";

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@projektNr", SqlDbType.Int);
            par.Value = projektNr;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    tid = (int)datareader["tid"];

                    system.IndlæsTidArbejdsLog(tid);    // Opret tiden i systemet
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }

                return false;
            }

            return true;
        }

        #endregion

        #region Operationer på faktura- og vare-objekter

        // Metode til at indlæse faktura-objekter fra databasen
        public void IndlæsFaktura()
        {
            SqlDataReader datareader;
            int fakturaNr;
            string valutaType, betalingsmetode, besked;
            DateTime fakturadato, leveringsdato, betalingsdato;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsFaktura";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    fakturaNr = (int)datareader["fakturaNr"];
                    valutaType = (string)datareader["valutaType"];
                    fakturadato = (DateTime)datareader["fakturadato"];
                    leveringsdato = (DateTime)datareader["leveringsdato"];
                    betalingsdato = (DateTime)datareader["betalingsdato"];
                    betalingsmetode = (string)datareader["betalingsmetode"];
                    besked = (string)datareader["besked"];

                    // Opret faktura-objektet i systemet
                    system.IndlæsFaktura(fakturaNr, valutaType, fakturadato, leveringsdato, betalingsdato, betalingsmetode, besked);   
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // Metode til at oprette et faktura-objekt i databasen
        public bool OpretFaktura(string valutaType, DateTime fakturadato, DateTime leveringsdato, DateTime betalingsdato,
            string betalingsmetode, string besked, out int fakturaNr)
        {
            cmd.CommandText = "OpretFaktura";

            cmd.Parameters.Clear();

            // sæt værdier i parametre
            SqlParameter par = new SqlParameter("@valutaType", SqlDbType.NVarChar);
            par.Value = valutaType;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@fakturadato", SqlDbType.DateTime);
            par.Value = fakturadato;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@leveringsdato", SqlDbType.DateTime);
            par.Value = leveringsdato;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@betalingsdato", SqlDbType.DateTime);
            par.Value = betalingsdato;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@betalingsmetode", SqlDbType.NVarChar);
            par.Value = betalingsmetode;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@besked", SqlDbType.NVarChar);
            par.Value = besked;
            cmd.Parameters.Add(par);

            // Output-parameter
            par = new SqlParameter("@fakturaNr", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen

                fakturaNr = (int)cmd.Parameters["@fakturaNr"].Value;   // fakturaNr = output-parameter
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }

                fakturaNr = 0;
                return false;
            }

            return true;
        }

        // Metode til at indlæse vare-objekter fra databasen
        public void IndlæsVarer()
        {
            SqlDataReader datareader;
            int fakturaNr, vareID, antal;
            string varebeskrivelse, enhed;
            double prisPrEnhedEkskl, moms, varetotalEkskl;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsVare";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                { 
                    vareID = (int)datareader["vareID"];
                    varebeskrivelse = (string)datareader["varebeskrivelse"];
                    antal = (int)datareader["antal"];
                    enhed = (string)datareader["enhed"];
                    prisPrEnhedEkskl = (double)datareader["prisPrEnhedEksklMoms"];
                    moms = (double)datareader["moms"];
                    varetotalEkskl = (double)datareader["varetotalEkskl"];
                    fakturaNr = (int)datareader["fakturaNr"];

                    // Opret vare-objektet i systemet
                    system.IndlæsVare(fakturaNr, vareID, varebeskrivelse, antal, enhed, prisPrEnhedEkskl, moms, varetotalEkskl);    
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // Metode til at oprette et vare-objekt i databasen
        public bool OpretVare(int fakturaNr, string varebeskrivelse, int antal, string enhed, double prisPrEnhedEkskl, double moms, 
            double varetotalEkskl, out int vareID)
        {
            cmd.CommandText = "OpretVare";

            cmd.Parameters.Clear();

            // sæt værdier i parametre
            SqlParameter par = new SqlParameter("@fakturaNr", SqlDbType.Int);
            par.Value = fakturaNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@varebeskrivelse", SqlDbType.NVarChar);
            par.Value = varebeskrivelse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@antal", SqlDbType.Int);
            par.Value = antal;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@enhed", SqlDbType.NVarChar);
            par.Value = enhed;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@prisPrEnhedEkskl", SqlDbType.Float);
            par.Value = prisPrEnhedEkskl;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@moms", SqlDbType.Float);
            par.Value = moms;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@varetotalEkskl", SqlDbType.Float);
            par.Value = varetotalEkskl;
            cmd.Parameters.Add(par);

            // Output-parameter
            par = new SqlParameter("@vareID", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen

                vareID = (int)cmd.Parameters["@vareID"].Value;   // vareID = output-parameter
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }

                vareID = 0;
                return false;
            }

            return true;
        }

        #endregion
    }
}
